javascript入门:this的规则与bind的各种风骚用法

javascript的任何函数的作用域中都有一个this变量。理解这个this变量才能正确地编写javascript程序,正确使用javascript的各种功能。

 

this变量是这样确定的:

1 如果函数未调用过bind:

  a. 使用点运算符调用,等于调用时左边的点运算符左边的对象。

  b. 不使用点运算符调用,等于window。

 

2 如果函数调用过了bind:

  a. 通过new调用,等于新的对象(this)。

  b. 不通过new调用,

    1) 绑定时最左边参数为null或undefined,等于window

    2) 绑定时最左边参数非null,必然等于该参数

 

bind的作用是从左到右为函数绑定参数。绑定的第一个参数总是null。这个函数本质上会返回一个闭包,因此能够可靠的保存下调用上下文。

msdn给出了一个bind的实现,这里稍作注释:

Function.prototype.bind = function(oThis) {      //只有一个参数,事实上可以有变化个数,在函数中会处理   
if(typeof this !== 'function') {     //确保bind是对function调用,而不是其他对象
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
} 
var fSlice = Array.prototype.slice;
aArgs = fSlice.call(arguments, 1);    //把除了重定义this的其他参数拿出来 
fToBind = this;
fNOP = function() {};            //它存在的意义完全是处理用new调用bind后函数的情况
fBound = function() { 
return fToBind.apply(this instanceof fNOP ? this : oThis || window,   aArgs.concat(fSlice.call(arguments)));     //重新定义this,如果this 是fNOP说明正在用new调用,则不使用bind的this,因为此时这个函数是作为新对象的构造函数
}; 
fNOP.prototype = this.prototype; 
fBound.prototype = new fNOP();       //相当于定义了一个原函数的子类
return fBound; 
}; 

 

posted @ 2016-12-28 12:30  长空小鹰  阅读(279)  评论(0编辑  收藏  举报